{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3\n",
      "1\n"
     ]
    }
   ],
   "source": [
    "\n",
    "import gym\n",
    "import random\n",
    "import torch\n",
    "import numpy as np\n",
    "from collections import deque\n",
    "import matplotlib.pyplot as plt\n",
    "from src.PPO.PPO import PPO, PPOContinuous\n",
    "import pdb\n",
    "import time\n",
    "\n",
    "# env_name = \"BipedalWalker-v2\"\n",
    "env_name = \"Pendulum-v0\"\n",
    "env = gym.make(env_name)\n",
    "\n",
    "env.seed(1234)\n",
    "\n",
    "state_size = env.observation_space.shape[0]\n",
    "action_size =env.action_space.shape[0]\n",
    "\n",
    "print(state_size)\n",
    "print(action_size)\n",
    "\n",
    "# PPO Settings\n",
    "update_every = 2000\n",
    "num_learn = 4\n",
    "win_condition = 0\n",
    "\n",
    "# Agent settings\n",
    "hidden_size=256\n",
    "epsilon=0.2\n",
    "entropy_beta=0.01\n",
    "gamma=0.99\n",
    "lr=0.0003\n",
    "\n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "agent = PPOContinuous(state_size, action_size, hidden_size=hidden_size, epsilon=epsilon, entropy_beta=entropy_beta, gamma=gamma, lr=lr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode 100\tAverage Score: -1135.68\tScore: -1126.97\n",
      "Episode 200\tAverage Score: -1149.31\tScore: -1091.55\n",
      "Episode 300\tAverage Score: -1129.90\tScore: -1239.33\n",
      "Episode 400\tAverage Score: -1153.77\tScore: -1217.58\n",
      "Episode 500\tAverage Score: -1112.14\tScore: -1050.32\n",
      "Episode 600\tAverage Score: -1139.47\tScore: -1152.26\n",
      "Episode 700\tAverage Score: -1132.01\tScore: -1005.59\n",
      "Episode 800\tAverage Score: -1106.13\tScore: -1017.17\n",
      "Episode 900\tAverage Score: -1127.06\tScore: -1165.95\n",
      "Episode 1000\tAverage Score: -1150.73\tScore: -1443.29\n",
      "Episode 1100\tAverage Score: -1124.13\tScore: -771.518\n",
      "Episode 1200\tAverage Score: -1158.05\tScore: -1082.17\n",
      "Episode 1300\tAverage Score: -1109.13\tScore: -949.721\n",
      "Episode 1400\tAverage Score: -1130.15\tScore: -1019.57\n",
      "Episode 1500\tAverage Score: -1105.79\tScore: -886.552\n",
      "Episode 1600\tAverage Score: -1114.61\tScore: -1452.29\n",
      "Episode 1700\tAverage Score: -1088.50\tScore: -997.345\n",
      "Episode 1800\tAverage Score: -1053.30\tScore: -911.986\n",
      "Episode 1900\tAverage Score: -1101.82\tScore: -908.075\n",
      "Episode 2000\tAverage Score: -1111.19\tScore: -1045.26\n"
     ]
    }
   ],
   "source": [
    "\n",
    "scores_deque = deque(maxlen=100)\n",
    "scores = []\n",
    "average_scores = []\n",
    "max_score = -np.Inf\n",
    "\n",
    "def train(n_episodes=2000, max_t=1500):\n",
    "#   agent = PPO(state_size, action_size, hidden_size=hidden_size, epsilon=epsilon, entropy_beta=entropy_beta, gamma=gamma, lr=lr)\n",
    "  steps = 0\n",
    "\n",
    "  for episode in range(1, n_episodes+1):\n",
    "    state = env.reset()\n",
    "    score = 0\n",
    "    \n",
    "    for t in range(max_t):\n",
    "      steps += 1\n",
    "\n",
    "      actions_tensor, log_prob = agent.act(torch.FloatTensor(state).to(device))\n",
    "      actions = actions_tensor.cpu().data.numpy().flatten()\n",
    "      next_state, reward, done, _ = env.step(actions_tensor.cpu().numpy())\n",
    "\n",
    "      agent.mem.add(torch.FloatTensor(state), actions, reward, log_prob, done)\n",
    "\n",
    "      # Update \n",
    "      state = next_state\n",
    "      score += reward\n",
    "\n",
    "      if steps >= update_every:\n",
    "        start_time = time.time()\n",
    "        \n",
    "        agent.learn(num_learn)\n",
    "        agent.mem.clear()\n",
    "        steps = 0\n",
    "\n",
    "#         print(\"\\rLearning Time: {}\".format(time.time()-start_time))\n",
    "\n",
    "      if done:\n",
    "        break\n",
    "    \n",
    "    # Book Keeping\n",
    "    scores_deque.append(score)\n",
    "    scores.append(score)\n",
    "    average_scores.append(np.mean(scores_deque))\n",
    "      \n",
    "\n",
    "    print(\"\\rEpisode {}\tAverage Score: {:.2f}\tScore: {:.2f}\".format(episode, np.mean(scores_deque), score), end=\"\")\n",
    "\n",
    "    if episode % 100 == 0:\n",
    "      print(\"\\rEpisode {}\tAverage Score: {:.2f}\".format(episode, np.mean(scores_deque)))   \n",
    "#       torch.save(agent.model.state_dict(), \"walker_ppo_model_{}.pth\".format(episode))\n",
    "#       torch.save(agent.model_old.state_dict(), \"walker_ppo_model_old_{}.pth\".format(episode))\n",
    "    \n",
    "    if np.mean(scores_deque) > win_condition:\n",
    "      print(\"\\rEnvironment Solved in {} episodes!\".format(episode))\n",
    "      break\n",
    "\n",
    "\n",
    "  return scores, average_scores\n",
    "\n",
    "scores, average_scores = train()"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "torch.save(agent.model.state_dict(), \"Pendulum-v0_model.pth\")\n",
    "torch.save(agent.model_old.state_dict(), \"Pendulum-v0_model_old.pth\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x125052630>]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(scores)\n",
    "plt.plot(average_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for episode in range(0):\n",
    "    state = env.reset()\n",
    "    score = 0\n",
    "    input()\n",
    "\n",
    "    for t in range(1500):\n",
    "        actions_tensor, log_prob = agent.act(torch.FloatTensor(state))\n",
    "        actions = actions_tensor.cpu().data.numpy().flatten()\n",
    "        next_state, reward, done, _ = env.step(actions_tensor)\n",
    "\n",
    "        \n",
    "        score += reward\n",
    "        \n",
    "        env.render()\n",
    "        \n",
    "        if done:\n",
    "            break;\n",
    "        \n",
    "        state = next_state\n",
    "\n",
    "    print(score)\n",
    "env.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
